package com.strong.faker;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import com.strong.FakerConstants;
import com.strong.enum_.ProvinceEnum;
import com.strong.model.Place;
import com.strong.utils.FakerUtils;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;


/**
 * 位置 模拟数据生成类
 *
 * @author simen
 * @date 2023/04/07
 */
@Slf4j
@Getter
public class PlaceFaker extends BaseFaker<Place> {

    /**
     * 所在地列表
     */
    private List<Place> listPlace;

    /**
     * 注入 所在地行政代码数组
     *
     * @param strsDivisionCode 所在地行政代码数组
     * @return {@link PlaceFaker}
     */
    public PlaceFaker divisionCode(String... strsDivisionCode) {
        // 断言参数非空
        Assert.isTrue(ArrayUtil.isNotEmpty(strsDivisionCode), "注入的所在地行政代码为空");

        // 从完整地址队列中找出对应的地址队列
        this.listPlace = FakerUtils.getPlaceList(strsDivisionCode);
        return this;
    }

    /**
     * 注入省枚举
     *
     * @param provinceEnums 省枚举
     * @return {@link PlaceFaker}
     */
    public PlaceFaker province(ProvinceEnum... provinceEnums) {
        // 断言参数非空
        Assert.isTrue(ArrayUtil.isNotEmpty(provinceEnums), "注入的省枚举数组为空");

        return divisionCode(ArrayUtil.addAll(Arrays.stream(provinceEnums).map(ProvinceEnum::getDivisionCode).toArray(String[][]::new)));
    }

    @Override
    protected void initialize() {
        // 判断地址队列是否为空 记录日志
        if (CollUtil.isEmpty(this.listPlace)) {
            // 如果为空，则赋值为完整地址队列
            listPlace = FakerConstants.LIST_ALL_PLACE;
            log.debug("所在地行政代码[所有]");
        } else {
            StringBuilder sbLog = new StringBuilder();
            this.listPlace.forEach((place) -> sbLog.append(place.getIdPlaceCode()).append(","));
            log.debug("所在地行政代码：{}", sbLog);
        }
    }

    @Override
    protected Place getModel() {
        return RandomUtil.randomEle(this.listPlace);
    }
}
